/*
 * estacionSospechosos.cpp
 *
 *  Created on: Oct 16, 2013
 *      Author: m
 */

#include <iostream>
#include <cstdlib>
#include "DefinicionesComunes.h"
#include "NewMessageQueue.h"
#include "NewSemaphore.h"
#include "NewSharedMemory.h"
#include "CPrinter.h"

using namespace ipc;

int main( int argc, char* argv[] )
{
    int nVuelos;

    CPrinter::setHeader( "EST SOSP" );

    /*
     * Parseo los argumentos:
     *  argv[1] : Cantidad de vuelos disponibles
     */

    if ( argc != 2 )
    {
        CPrinter::printErr("ERROR: Cantidad de Argumentos Invalida.\n"
                "USO:\testacionSospechosos [nVuelos]");
        exit(1);
    }

    std::stringstream ss;

    ss.str( argv[1] );
    ss >> nVuelos;

    // IPCs
    SharedMemory<int> shmContadorSospechosos =
            SharedMemory<int>::get( IPC_BASE_FILE, SHM_CONT_SOSPECHOSO );
    Semaphore mutexContadorSospechosos =
            Semaphore::get( IPC_BASE_FILE, MUTEX_CONT_SOSPECHOSO );
    MessageQueue<MensajeEquipaje> cintaSospechosos =
            MessageQueue<MensajeEquipaje>::get( IPC_BASE_FILE, MQ_SOSPECHOSO );
    MessageQueue<int> mqNotificacionEquipaje =
            MessageQueue<int>::get( IPC_BASE_FILE, MQ_NOTIFICACIONES );

    CPrinter::printOut( "INICIADO" );

    while( true )
    {
        MensajeEquipaje equipaje;
        int nSospechosos;
        int idVuelo;

        equipaje = cintaSospechosos.get( 0 );

        idVuelo = equipaje.getVuelo();

        CPrinter::printOut( "Detectado equipaje sospechoso para el vuelo: %d"
                , idVuelo );

        mutexContadorSospechosos.p( idVuelo - 1 );

        nSospechosos = shmContadorSospechosos.read( idVuelo - 1 );
        nSospechosos++;
        shmContadorSospechosos.write( nSospechosos, idVuelo - 1 );

        mutexContadorSospechosos.v( idVuelo - 1 );

        mqNotificacionEquipaje.put( MTYPE_NOTIFICACIONES, idVuelo );
    }

}
